export { }
// 在ts中 ts会视整个项目为全局，在其中定义变量时，ts会认为是全局的  类似js中var声明变量会挂到window上一样

// 文件模块  如果文件中出现了import  export 则会被ts视为文件模块(外部模块)

// 命名空间   被namespace包裹的内容  叫内部模块

// 类型声明
// 普通类型声明   可以声明任意类型的数据 变量  对象  函数  方法  类  都可以  没有什么实际意义  会在编译时删除
declare let name: string

// 外部枚举
declare enum Seasons { // 季节
  Spring,
  Summer,
  Autumn,
  Winter
}
let seasons = [
  Seasons.Spring,
  Seasons.Summer,
  Seasons.Autumn,
  Seasons.Winter
];
// declare 定义的类型只会用于编译时的检查，编译结果中会被删除 所以编译完之后Seasons 不存在会报错
console.log(seasons);
/**
var seasons = [
    Seasons.Spring,
    Seasons.Summer,
    Seasons.Autumn,
    Seasons.Winter
];
 */

// 可以在枚举声明中添加const关键字
declare const enum Seasons2 { // 季节
  Spring,
  Summer,
  Autumn,
  Winter
}
let seasons2 = [
  Seasons2.Spring,
  Seasons2.Summer,
  Seasons2.Autumn,
  Seasons2.Winter
];
console.log(seasons2); // [ 0, 1, 2, 3 ]

// namespace 如果一个变量有很多子属性  就可以用namespace  声明文件中的namespace表示一个全局变量包含很多子属性
// declare namespace $ {
//   function ajax(): void
//   let name: string
//   namespace fn {
//     function extend(): void
//   }
// }
// $.ajax()

// 类型声明文件
/**
  可以把类型声明放在一个单独的类型声明文件中
  在类型声明文件中使用类型声明
  文件命名规范为*.d.ts
  观看类型声明文件有助于了解库的使用方式
 */
$.click('#') // 由于在typing.d.ts中声明过  并且在tsconfig的include中包含进去了  所以这里可以直接使用

// 第三方声明文件 @types
/**
 * @types是一个约定的前缀，所有的第三方声明的类型库都会带有这样的前缀
 * JavaScript 中有很多内置对象，它们可以在 TypeScript 中被当做声明好了的类型
 * 内置对象是指根据标准在全局作用域（Global）上存在的对象。这里的标准是指 ECMAScript 和其他环境（比如 DOM）的标准
 *
    node_modules/jquery/package.json
    "types":"types/xxx.d.ts"
    node_modules/jquery/index.d.ts
    node_modules/@types/jquery/index.d.ts
    typings\jquery\index.d.ts
 */

// 扩展局部变量的类型
declare var String: StringConstructor
interface StringConstructor {
  new(value?: any): String // 返回一个string类
  (value: any): string  // 返回一个字符串
  readonly prototype: String
}

declare global {
  interface String {
    toString(): string

  }
  interface String {
    double(): string
  }
}
String.prototype.double = function () {
  return this + this
}
let dbhello = new String('hello').double()

// 命名空间
class Form {
  name: Form.Item
  parsword: Form.Item
}
namespace Form {
  export class Item { }
}

// 为函数扩展属性
function hello() {

}
namespace hello {
  export let words = ''
}
hello.words

// 使用命名空间扩展枚举属性
enum Color {
  red = 1,
  yellow = 2,
  bule = 3
}
namespace Color {
  export const green = 4
  export const purple = 5
}
Color.purple